/* RAM disk */ /* Philip J. Erdelsky - June 23, 1988 */ #include "dd.h" #define SECTOR_SIZE 512 #define KILOBYTE 1024 #define DIRECTORY_ENTRY_SIZE 32 #define TBA 0 #define DIRECTORY_ENTRIES_PER_SECTOR (SECTOR_SIZE/DIRECTORY_ENTRY_SIZE) struct sector { bite x[SECTOR_SIZE]; }; static struct sector *buffer; /* bootstap block */ static bite jump[3] = {0,0,0}; static char OEM[8] = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}; /* BIOS Parameter Block */ struct bpb BPB = { SECTOR_SIZE, /* bytes_per_sector */ 1, /* sectors_per_allocation_unit */ 1, /* reserved_sectors */ 1, /* FATs */ TBA, /* root_directory_entries */ TBA, /* total_sectors */ 0xFE, /* media_descriptor */ TBA, /* sectors_per_FAT */ 8, /* sectors_per_track */ 1, /* heads */ 0 /* hidden_sectors */ }; static struct bpb *bpb_table[1]; static unsigned int get_number(p) char *p; { unsigned int n = 0; int c; if (p==NULL) return 0; c = *p++; while ('0'<=c && c<='9') { n = 10*n + c - '0'; c = *p++; } return n; } void init() { unsigned int capacity; capacity = get_number(argument(1)); if (capacity==0) capacity = 160; BPB.root_directory_entries = get_number(argument(2)); if (BPB.root_directory_entries==0) BPB.root_directory_entries = 64; BPB.root_directory_entries = (BPB.root_directory_entries + (DIRECTORY_ENTRIES_PER_SECTOR-1)) & (-DIRECTORY_ENTRIES_PER_SECTOR); BPB.total_sectors = capacity*(KILOBYTE/SECTOR_SIZE); { unsigned int FAT_bytes; FAT_bytes = BPB.total_sectors + (BPB.total_sectors+1)/2; BPB.sectors_per_FAT = (FAT_bytes + SECTOR_SIZE - 1) / SECTOR_SIZE; } puts("\nRAM disk installed, capacity = "); puts(capacity==160 ? "160" : argument(1)); puts("K\n"); buffer = (struct sector *) (request_header->x.init.end_of_driver); request_header->x.init.end_of_driver += (long) BPB.total_sectors * (long) BPB.bytes_per_sector; buffer[0] = *((struct sector *)(&jump)); { int i; char *q; q = buffer[BPB.reserved_sectors].x; for (i=0; ix.init.pointer.bpb_table = bpb_table; request_header->x.init.number_of_units = 1; request_header->status = DONE_STATUS; } void media_check() { request_header->x.media_check.returned = 1; request_header->status = DONE_STATUS; } void build_bpb() { request_header->x.build_bpb.bpb = &BPB; request_header->status = DONE_STATUS; } void ioctl_input() {bad_device_driver_function();} void input() { unsigned sector, n; struct sector *p; sector = request_header->x.io.starting_sector; p = (struct sector *) (request_header->x.io.transfer_address); n = request_header->x.io.count; while (n>0 && sectorstatus = DONE_STATUS; } void nondestructive_input() { request_header->status = DONE_STATUS; } void input_status() { request_header->status = DONE_STATUS; } void input_flush() { request_header->status = DONE_STATUS; } void output() { unsigned sector, n; struct sector *p; sector = request_header->x.io.starting_sector; p = (struct sector *) (request_header->x.io.transfer_address); n = request_header->x.io.count; while (n>0 && sectorstatus = DONE_STATUS; } void output_with_verify() { output(); } void output_status() { request_header->status = DONE_STATUS; } void output_flush() { request_header->status = DONE_STATUS; } void ioctl_output() {bad_device_driver_function();}